import { defineConfig } from "vite";
import vue from "@vitejs/plugin-vue";
import { visualizer } from "rollup-plugin-visualizer";
import AutoImport from "unplugin-auto-import/vite";
import Components from "unplugin-vue-components/vite";
import { ElementPlusResolver } from "unplugin-vue-components/resolvers";
import { createSvgIconsPlugin } from "vite-plugin-svg-icons";
import path from "path";
import ViteRestart from "vite-plugin-restart";
import ViteImages from "vite-plugin-vue-images";
import ViteImagemin from "vite-plugin-imagemin";

// https://vitejs.dev/config/
export default defineConfig({
  build: {
    // 如果没有特别的压缩需求，可以不用配置
    minify: "terser",
    terserOptions: {
      // 清除所有console和debugger
      compress: {
        drop_console: true,
        drop_debugger: true,
      },
    },
  },
  plugins: [
    vue(),
    visualizer({
      open: false,
      filename: "visualizer.html",
    }),
    AutoImport({
      // 按需导入element plus组件
      resolvers: [ElementPlusResolver()],
      // 自动引入 vue3 hooks
      imports: ["vue"],
      dts: "auto-imports.d.ts",
      eslintrc: {
        // 为 true 时会生成 .eslint-auto-import.json,之后改为 false 就行
        enabled: false,
      },
    }),
    // 按需导入element plus 自定义主题
    Components({
      resolvers: [ElementPlusResolver({ importStyle: "sass" })],
      dts: true,
    }),
    createSvgIconsPlugin({
      // 指定需要缓存的图标文件夹
      iconDirs: [path.resolve(process.cwd(), "src/assets/svg-icons/")],
      // 指定symbolId格式
      symbolId: "icon-[dir]-[name]",
      /**
       * 自定义插入位置
       * @default: body-last
       */
      inject: "body-last" || "body-first",
      /**
       * custom dom id
       * @default: __svg__icons__dom__
       */
      customDomId: "__svg__icons__dom__",
    }),
    // 更改 vite.config.ts，自动重启项目
    ViteRestart({
      restart: ["vite.config.ts"],
    }),
    // 自动导入图像
    ViteImages({
      dirs: ["src/assets"], // 图像目录的相对路径
      extensions: ["png", "jpg", "jpeg", "webp", "gif"], // 有效的图像扩展
      customResolvers: [], // 覆盖名称->图像路径解析的默认行为
      customSearchRegex: "([a-zA-Z0-9]+)", // 重写搜索要替换的变量的Regex。
    }),
    // 图片资源压缩
    ViteImagemin({
      gifsicle: {
        // gif图片压缩
        optimizationLevel: 3, // 选择1到3之间的优化级别
        interlaced: false, // 隔行扫描gif进行渐进式渲染
      },
      optipng: {
        // png
        optimizationLevel: 7, // 选择0到7之间的优化级别
      },
      mozjpeg: {
        // jpeg
        quality: 70, // 压缩质量，范围从0(最差)到100(最佳)。
      },
      pngquant: {
        // png
        quality: [0.8, 0.9], // Min和max是介于0(最差)到1(最佳)之间的数字，类似于JPEG。达到或超过最高质量所需的最少量的颜色。如果转换导致质量低于最低质量，图像将不会被保存。
        speed: 4, // 压缩速度，1(强力)到11(最快)
      },
      svgo: {
        plugins: [
          // svg压缩
          {
            name: "removeViewBox",
          },
          {
            name: "removeEmptyAttrs",
            active: false,
          },
        ],
      },
    }),
  ],
  server: {
    host: "0.0.0.0",
    hmr: { overlay: false }, // 禁用或配置 HMR 连接 设置 server.hmr.overlay 为 false 可以禁用服务器错误遮罩层
    // 服务配置
    open: true, // 类型： boolean | string在服务器启动时自动在浏览器中打开应用程序；
    cors: true, // 类型： boolean | CorsOptions 为开发服务器配置 CORS。默认启用并允许任何源
    proxy: {
      "/test": {
        target: "http://39.107.159.90:8002",
        changeOrigin: true,
      },
    },
  },
  resolve: {
    alias: {
      "@": "/src/",
    },
    extensions: [".js", ".ts", ".json", ".vue", ".jsx", ".tsx"],
  },
});
